from sqlalchemy import create_engine, ForeignKey, Column, Integer, String, Float, Date, Numeric,JSON, SmallInteger
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.mutable import MutableList
from sqlalchemy.orm import sessionmaker, relationship
from.base import Base

    
class Company(Base):
    """
    公司信息
    """
    __tablename__ = 'companies'  # 定义表名

    id = Column(Integer, primary_key=True)  # 公司ID
    a_stock_code = Column(String(20))  # A股股票代码
    name = Column(String(255))  # 公司名称
    english_name = Column(String(255))  # 英文名称
    location = Column(String(255))  # 所属地域
    industry = Column(JSON)  # 所属行业，使用JSON类型存储数组字符串
    website = Column(String(255))  # 公司网址
    main_business = Column(String(1024))  # 主营业务
    product_names = Column(String(1024))  # 产品名称
    controlling_stockholder = Column(String(255))  # 控股股东
    actual_controller = Column(String(255))  # 实际控制人
    ultimate_controller = Column(String(255))  # 最终控制人
    chairman = Column(String(255))  # 董事长
    secretary = Column(String(255))  # 董秘
    legal_representative = Column(String(255))  # 法人代表
    general_manager = Column(String(255))  # 总经理
    registered_capital = Column(Float)  # 注册资金
    employee_count = Column(Integer)  # 员工人数
    phone = Column(String(20))  # 联系电话
    fax = Column(String(20))  # 传真
    postcode = Column(String(10))  # 邮编
    office_address = Column(String(255))  # 办公地址

    executives = relationship("Executive", back_populates="company")
    # 添加与股东的关联
    shareholders = relationship("Shareholder", back_populates="company")
    # 添加与股本结构的关联
    share_capital = relationship("ShareCapital", back_populates="company")

    shareholders = relationship("T10S", back_populates="company")

    business_introduction = relationship("BusinessIntroduction", back_populates="company")

    operational_data = relationship("OperationalData", back_populates="company")

    financial_summary = relationship("FinancialSummary", back_populates="company")

    business_composition = relationship("BusinessComposition", back_populates="company")

    balance_sheet = relationship("BalanceSheet", back_populates="company")

    profit_statement = relationship("ProfitStatement", back_populates="company")

    financial_report = relationship("FinancialReport", back_populates="company")
    
class Executive(Base):
    """
    高管信息
    """
    __tablename__ = 'executives'  # 定义表名

    id = Column(Integer, primary_key=True)  # 高管ID
    company_id = Column(Integer, ForeignKey('companies.id'))  # 外键指向Company表的id
    sequence_number = Column(Integer)  # 序号
    name = Column(String(255))  # 姓名
    position = Column(String(255))  # 职务
    appointment_date = Column(Date)  # 任职日期
    termination_date = Column(Date)  # 任职终止日
    gender = Column(String(10))  # 性别
    education = Column(String(255))  # 学历
    birth_date = Column(Date)  # 出生日期
    salary = Column(Numeric(10, 2))  # 薪酬（元）
    shareholding = Column(Numeric(10, 2))  # 持股数（万股）
    personal_profile = Column(String(2048))  # 个人简历
    company = relationship("Company", back_populates="executives")

class ShareCapital(Base):
    """
    股份构成
    """
    __tablename__ = 'share_capital'
    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('companies.id'))  # 外键指向Company表的id
    total_shares = Column(Float)  # 总股本
    a_stock_total = Column(Float)  # A股总股本
    circulating_a_stock = Column(Float)  # 流通A股
    restricted_a_stock = Column(Float)  # 限售A股
    date = Column(Date)  # 数据日期
    change_reason = Column(String(255)) #变更原因

    company = relationship("Company", back_populates="share_capital")

class T10S(Base):
    """
    Top 10 Shareholders 十大股东
    """
    __tablename__ = 'shareholders'
    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('companies.id'))  # 外键指向Company表的id
    name = Column(String(255))  # 机构或基金名称
    holding_amount = Column(Float)  # 持有数量
    holding_change = Column(Float)  # 持股变化
    percentage_held = Column(Float)  # 占流通股比例
    estimated_cost = Column(Float)  # 机构成本估算
    actual_change = Column(Float)  # 实际增减持
    share_type = Column(String(255))  # 股份类型
    as_of_date = Column(Date)  # 记录的截至日期
    holder_type = Column(SmallInteger) # 0:十大股东, 1:流通股东

    company = relationship("Company", back_populates="shareholders")

# example
# 创建Session类
# Session = sessionmaker(bind=engine)
# session = Session()

# 插入飞亚达公司的数据
# company = Company(
#     name='飞亚达精密科技股份有限公司',
#     english_name='Fiyta Precision Technology Co.,Ltd.',
#     location='广东省',
#     industry=['珠宝首饰','珠宝首饰'],
#     website='http://www.fiytagroup.com',
#     main_business='钟表及其零配件的设计、开发、制造、销售和维修业务，包括\"飞亚达\"表的产品经营和世界名表的商业连锁销售。',
#     product_names='手表品牌业务、手表零售服务业务、精密科技业务、租赁业务',
#     controlling_stockholder='中航国际控股有限公司 (持有飞亚达精密科技股份有限公司股份比例：39.25%）',
#     actual_controller='中国航空工业集团有限公司(持有飞亚达精密科技股份有限公司股份比例：39.25%）',
#     ultimate_controller='国务院国有资产监督管理委员会(持有飞亚达精密科技股份有限公司股份比例：39.25%）',
#     chairman='张旭华',
#     secretary='宋瑶明',
#     legal_representative='张旭华',
#     general_manager='潘波',
#     registered_capital=4.15e8,  # 将注册资金转换为浮点数表示的亿元
#     employee_count=4238,
#     phone='86-0755-86013669',
#     fax='86-0755-83348369',
#     postcode='518057',
#     office_address='广东省深圳市南山区高新南一道飞亚达科技大厦20楼'
# )

# # 添加到session并提交
# session.add(company)
# session.commit()

# # 关闭session
# # session.close()
#在这个例子中，我们首先定义了一个Company类，它继承自Base，这是SQLAlchemy的声明式基类。每个属性都对应一个Column对象，它定义了字段的类型和特性。

# 然后，我们创建了一个SQLite数据库引擎，并告诉SQLAlchemy使用这个引擎。接着，我们使用Base.metadata.create_all(engine)创建了表。

# 最后，我们创建了一个Company实例，填充了飞亚达公司的相关信息，并将其添加到session中，然后提交了这个session，这样就将公司信息存储到了数据库中。最后别忘了关闭session。